import { getToken, setToken, removeToken, setTimeStamp, removeTimeStamp } from '@/utils/auth'
import { getUserInfo, getUserDetailById, login } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  token: getToken(), // 持久化的目的是一刷新token还在，仍然保持登录状态。一刷新从cookie获取token
  userInfo: {} // 用户信息
}
// localstorage sessionstorage cookie
// 持久化可以写在localstorage和sessionstorage
const mutations = {
  setToken(state, token) {
    state.token = token // 最开始登录，token失效的时候重新登录
    setToken(token)
  },
  removeToken(state) {
    state.token = null // 登出
    removeToken()
  },
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  async login(context, data) {
    // data: mobile password
    const token = await login(data)
    // axios包一层data

    context.commit('setToken', token)
    // 存时间戳
    setTimeStamp()
  },
  async getUserInfo(context) {
    const userInfo = await getUserInfo() // 给了token，token -> 登录信息。redis数据库 {token: 登录信息}
    const result = await getUserDetailById(userInfo.userId)
    const obj = { ...userInfo, ...result }
    context.commit('setUserInfo', obj)
    return obj
  },
  logout(context) {
    // 1. 删除token
    context.commit('removeToken')
    // 2. 删除用户信息
    context.commit('removeUserInfo')
    // 登出时候清除时间戳
    removeTimeStamp()

    // 真实项目中应该调取后端接口退出登录，退出登录后端登录信息也要删除

    resetRouter() // 重置路由规则
    // 清空vuex permission 的routes
    // user -> permission mutation
    // 全局 permission/setRoutes mutation
    // 全局命名空间 分发
    context.commit('permission/setRoutes', [], { root: true })
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
